package diameterOfBinaryTree

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

/**
给定一棵二叉树，你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
*/
func diameterOfBinaryTree(root *TreeNode) int {
	var findDiameter func(node *TreeNode) int
	var ans = 0 // 记录答案
	findDiameter = func(node *TreeNode) int {
		if node == nil {
			return 0
		}
		// 左子树最大深度
		left := findDiameter(node.Left)
		// 右子树最大深度
		right := findDiameter(node.Right)
		ans = max(ans, left+right) // 计算d_node即L+R+1 并更新ans
		// 返回单棵子树最大深度再加上自己这个节点
		return max(left, right) + 1

	}
	findDiameter(root)
	return ans
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
